#include <stdio.h>

//二维数组作为函数的参数
void Print(int (*a)[3])//用数组指针传递最安全，**a不可以因为丢失掉数组元素个数
{
    for(int i = 0; i < 3; i++)//行
    {
        for(int j = 0; j < 3; j++)//列
        {
            printf("|%d %p|",a[i][j],&a[i][j]);//a[i]a[j]也可以写成*(*a + i) + j
        }
        printf("\n");
    }
}
int main()
{
    //二维数组的定义
    int  a[][3] = {
        {1,2,3},
        {4,5,6},
        {7,8,9}
    };//每个数组里面有三个元素；可以行数不写，但是元素数不能不写；
    
    // Print(a);
    // //二维数组的遍历
    // for(int i = 0; i < 3; i++)//行
    // {
    //     for(int j = 0; j < 3; j++)//列
    //     {
    //         printf("|%d %p|",a[i][j],&a[i][j]);
    //     }
    //     printf("\n");
    // }
    
    // printf("%ld\n",sizeof(a));//整个数组
    // printf("%p %p %d\n",a,a + 1,*(*(a + 1)));//输出4
    // printf("%P %p %d\n",a[0],a[0] + 1,*(a[0] + 1));//输出2
    // printf("%p %p %d\n",&a[0][0],&a[0][0] + 1, a[0][0]);//输出1
    
    // //指针数组 ： 数组里的元素都是指针
    // int* p[3];
    // // p[0] = a;
    // // printf("%d\n", *(p[0]));//输出为1
    // // p[0] = a[1];
    // // printf("%d\n", *(p[0]));//输出为4
    // p[0] = a[0];
    // p[1] = a[1];
    // p[2] = a[2];
    // printf("%d\n",*(*(p + 1)));//输出为4
    
    // //数组指针：指向数组的指针！！！！
    // int (*p)[2];
    // // p = a;
    // // printf("%d\n",**p);//输出1
    // printf("%d\n",*(*(p + 1)));//输出3

    return 0;
}